package fiuba.algo3.tp2.modelo;

import java.io.File;
import java.io.IOException;
//import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.xml.sax.SAXException;

import fiuba.algo3.tp2.modelo.centrales.CentralElectrica;
import fiuba.algo3.tp2.modelo.centrales.CentralEolica;
import fiuba.algo3.tp2.modelo.estaciones.EstacionDeBomberos;
import fiuba.algo3.tp2.modelo.guardadores.GuardadorXML;
import fiuba.algo3.tp2.modelo.interfaces.ConectableATuberia;
import fiuba.algo3.tp2.modelo.juego.Juego;
import fiuba.algo3.tp2.modelo.juego.Jugador;
import fiuba.algo3.tp2.modelo.lineasTension.LineaDeTension;
import fiuba.algo3.tp2.modelo.mapa.Mapa;
import fiuba.algo3.tp2.modelo.objetos.ObjetoConVida;
import fiuba.algo3.tp2.modelo.posicion.Posicion;
import fiuba.algo3.tp2.modelo.pozos.PozoDeAgua;
import fiuba.algo3.tp2.modelo.rutas.RutaPavimentada;
import fiuba.algo3.tp2.modelo.terrenos.TerrenoDeAgua;
import fiuba.algo3.tp2.modelo.terrenos.TerrenoLlano;
import fiuba.algo3.tp2.modelo.tuberias.TuberiaDeAgua;
import fiuba.algo3.tp2.modelo.zonas.Comercial;
import fiuba.algo3.tp2.modelo.zonas.Industrial;
import fiuba.algo3.tp2.modelo.zonas.Residencial;
import fiuba.algo3.tp2.modelo.zonas.Zona;


public class GuardadorXMLtest {
	
	private String nombreArchivo;
	private GuardadorXML guardadorXML;
	private Mapa mapa;
	private Juego juego;
	private Jugador jugador;
	private TerrenoLlano tLlano;
	private TerrenoDeAgua tAgua;
	private ObjetoConVida central,estacion,tuberia,linea,pozo,ruta;
	private ConectableATuberia zona,zona2,zona3;
	

	@Before
	public void before() {
		
		this.nombreArchivo = java.util.UUID.randomUUID().toString() + ".xml";
		this.guardadorXML = new GuardadorXML(nombreArchivo);

		this.mapa = new Mapa(10,10);  
		this.tLlano = new TerrenoLlano(new Posicion(1,1));
		this.tAgua = new TerrenoDeAgua(new Posicion(1,2));
		this.central = new CentralEolica(new Posicion(1,3));
		this.estacion = new EstacionDeBomberos(new Posicion(1,4));
		this.pozo = new PozoDeAgua(new Posicion(2,1));
		this.zona = new Residencial(new Posicion(2,2));
		this.zona2 = new Industrial(new Posicion(2,3));
		this.zona3 = new Comercial(new Posicion(2,4));
		this.tuberia = new TuberiaDeAgua((PozoDeAgua)pozo,(ObjetoConVida) zona); // castie zona
		this.ruta = new RutaPavimentada((Zona)zona2,(Zona)zona3);
		this.linea = new LineaDeTension((CentralElectrica)central,(Zona)zona);
		(this.mapa).agregarObjeto(central);
		(this.mapa).agregarObjeto(estacion);
		(this.mapa).agregarObjeto(pozo);
		(this.mapa).agregarObjeto((ObjetoConVida)zona);
		(this.mapa).agregarObjeto(tuberia);
		(this.mapa).agregarObjeto(ruta);
		(this.mapa).agregarObjeto(linea);
		(this.mapa).agregarTerrenoLlano(tLlano);
		(this.mapa).agregarTerrenoDeAgua(tAgua);
		this.jugador = new Jugador(1200,"Seba",mapa);
		this.juego = new Juego(jugador);
		
	}
	
	@After
	public void after() {
		File archivo = new File(this.nombreArchivo);
		if (archivo.exists()) {
			archivo.delete();
		}
	}
	
	@Test
	public void guardarYRecuperar()throws ParserConfigurationException, TransformerException, SAXException, IOException  {
		
		Juego juegoNuevo;
		
		EstacionDeBomberos est,estNueva;
/*		List<ObjetoConVida> objs,objsNuevos;
		TerrenoLlano tLl,tLlNuevo;
		TerrenoDeAgua tA,tANuevo;
		Posicion pos,posNueva;*/
		
		(this.guardadorXML).guardar(this.juego);
		
		juegoNuevo = (this.guardadorXML).cargar();
		
		Assert.assertEquals(juego.obtenerJugador().getNombre(), juegoNuevo.obtenerJugador().getNombre());
		Assert.assertEquals(juego.obtenerJugador().getDinero(), juegoNuevo.obtenerJugador().getDinero());
		
		Assert.assertEquals(juego.obtenerJugador().getMapa().getAncho(), juegoNuevo.obtenerJugador().getMapa().getAncho());
		Assert.assertEquals(juego.obtenerJugador().getMapa().getLargo(), juegoNuevo.obtenerJugador().getMapa().getLargo());
		
		est = juego.obtenerJugador().getMapa().obtenerEstaciones().get(0);
		estNueva = juegoNuevo.obtenerJugador().getMapa().obtenerEstaciones().get(0);
		Assert.assertEquals(est.obtenerVida(),estNueva.obtenerVida());
	}


}
